﻿using System;
using System.Collections.Generic;
using System.Linq;
using Onshi.POS.Comun.Vistas;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Repositorios;

namespace Onshi.POS.Comun
{
    public class DomiciliosVerPresentador
    {
        #region Constructores

        public DomiciliosVerPresentador(IDomiciliosVer vista)
        {
            this.vista = vista;
        }

        #endregion

        #region Atributos

        private IDomiciliosVer vista;
        private Vendedor vendedor;

        #endregion

        #region Propiedades

        private RepositorioVendedor RepositorioVendedor
        {
            get { return new RepositorioVendedor(); }
        }

        #endregion

        #region Metodos

        private void ActualizarLista()
        {
            switch (vista.TipoEntidad)
            {
                case EnumTipoEntidad.CLIENTE:
                    break;
                case EnumTipoEntidad.PROVEEDOR:
                    break;
                case EnumTipoEntidad.VENDEDOR:
                    var vendedor = RepositorioVendedor.DevolverPorIdConDetalleDomiciliosTelefonos(vista.IdEntidad);
                    if (vendedor == null)
                        throw new Exception("El vendedor no existe");
                    this.vendedor = vendedor;
                    break;
            }
        }

        private List<Domicilio> FiltrarLista()
        {
            var lista = new List<Domicilio>();
            switch (vista.TipoEntidad)
            {
                case EnumTipoEntidad.CLIENTE:
                    break;
                case EnumTipoEntidad.PROVEEDOR:
                    break;
                case EnumTipoEntidad.VENDEDOR:
                    if (vendedor != null && vendedor.Domicilios != null)
                    {
                        var consulta = (from item in vendedor.Domicilios
                                        where item.TieneObservacion == (vista.TieneObservacionFiltro == EnumEstadoCheck.TODOS ? item.TieneObservacion : (vista.TieneObservacionFiltro == EnumEstadoCheck.SI ? true : false))
                                        & item.Calle.Contains(vista.CalleFiltro.Trim())
                                        & item.Numero.Contains(vista.NumeroFiltro.Trim())
                                        & item.Piso.Contains(vista.PisoFiltro.Trim())
                                        & item.Departamento.Contains(vista.DepartamentoFiltro.Trim())
                                        & item.Tipo.Id == (vista.IdTipoDomicilioFiltro == (Byte)EnumTipoDomicilio.TODOS ? item.Tipo.Id : vista.IdTipoDomicilioFiltro)
                                        & item.Barrio.Id == (vista.IdBarrioFiltro == (Int32)EnumBarrio.TODOS ? item.Barrio.Id : vista.IdBarrioFiltro)
                                        select item).ToList();

                        foreach (var item in consulta)
                            lista.Add((Domicilio)item);
                    }
                    else
                        lista = null;
                    break;
            }
            return lista;
        }

        public void Inicializar()
        {
            ActualizarLista();
            vista.Lista = FiltrarLista();
            switch (vista.TipoEntidad)
            {
                case EnumTipoEntidad.CLIENTE:
                    break;
                case EnumTipoEntidad.PROVEEDOR:
                    break;
                case EnumTipoEntidad.VENDEDOR:
                    vista.NombreEntidad = vendedor.ToString();
                    break;
            }
        }

        public void Filtrar()
        {
            vista.Lista = FiltrarLista();
        }

        #endregion
    }
}
